#include "components.h"
#include "lcd.h"
#include "smart_home.h"

/**
 * lcd_menu_init - 初始化LCD菜单
 *
 * 此函数用于初始化LCD菜单。当前实现中，此函数直接返回0，表示初始化成功。
 *
 * 返回值:
 * 0: 表示初始化成功
 */
int lcd_menu_init(void)
{
    return 0;
}

/**
 * lcd_menu_draw - 绘制单个LCD菜单项
 * @menu: 指向LCD菜单项的指针
 *
 * 此函数用于绘制单个LCD菜单项。首先检查传入的菜单项指针是否为NULL，如果是，则返回错误码-1。
 * 接着显示菜单项的图片，并在图片下方显示菜单项的文本。如果菜单项被选中，则文本背景色为LCD_BROWN，
 * 否则使用菜单项定义的背景色。
 *
 * 返回值:
 * -1: 表示传入的菜单项指针为NULL，函数执行失败
 * 0: 表示绘制成功
 */
int lcd_menu_draw(lcd_menu_t *menu)
{
    if (menu == NULL)
    {
        return -1;
    }
    /* 先显示图片 */
    lcd_show_picture(menu->base_x, menu->base_y, menu->img.width, menu->img.height, menu->img.img);

    /* LCD中英文混合显示 */
    // lcd_show_text(menu->base_x, menu->base_y + menu->img.height + 3, menu->text.name, menu->text.fc,
    //               menu->is_selected ? LCD_BROWN : menu->text.bc, menu->text.font_size, 0);
    lcd_show_text(menu->base_x + menu->img.width + 3, menu->base_y + 8, menu->text.name, menu->text.fc,
                  menu->is_selected ? LCD_BROWN : menu->text.bc, menu->text.font_size, 0);
    return 0;
}

/**
 * lcd_menu_show - 显示多个LCD菜单项
 * @menus: 指向LCD菜单项数组的指针
 * @menu_num: 菜单项的数量
 *
 * 此函数用于显示多个LCD菜单项。遍历菜单项数组，调用lcd_menu_draw函数绘制每个菜单项。
 */
int lcd_menu_show(lcd_menu_t *menus[], int menu_num)
{
    for (int i = 0; i < menu_num; i++)
    {
        lcd_menu_draw(menus[i]);
    }
}

/**
 * lcd_menu_update - 更新LCD菜单项的选中状态
 * @menus: 指向LCD菜单项数组的指针
 * @menu_num: 菜单项的数量
 * @lcd_menu_selected_index: 当前选中的菜单项索引
 *
 * 此函数用于更新LCD菜单项的选中状态。遍历菜单项数组，将指定索引的菜单项设置为选中状态，
 * 其他菜单项设置为未选中状态。
 */
void lcd_menu_update(lcd_menu_t *menus[], int menu_num, int lcd_menu_selected_index)
{
    for (int i = 0; i < menu_num; i++)
    {
        if (i == lcd_menu_selected_index)
        {
            lcd_menu_select(menus[i]);
        }
        else
        {
            lcd_menu_unselect(menus[i]);
        }
    }
}

/**
 * lcd_menu_select - 设置LCD菜单项为选中状态
 * @menu: 指向LCD菜单项的指针
 *
 * 此函数用于设置LCD菜单项为选中状态。将菜单项的is_selected成员设置为true。
 *
 * 返回值:
 * 0: 表示设置成功
 */
int lcd_menu_select(lcd_menu_t *menu)
{
    menu->is_selected = true;
    return 0;
}

/**
 * lcd_menu_unselect - 设置LCD菜单项为未选中状态
 * @menu: 指向LCD菜单项的指针
 *
 * 此函数用于设置LCD菜单项为未选中状态。将菜单项的is_selected成员设置为false。
 *
 * 返回值:
 * 0: 表示设置成功
 */
int lcd_menu_unselect(lcd_menu_t *menu)
{
    menu->is_selected = false;
    return 0;
}

/**
 * lcd_menu_entry - 进入LCD菜单项
 * @menu: 指向LCD菜单项的指针
 *
 * 此函数用于处理LCD菜单项的进入逻辑。首先检查传入的菜单项指针是否为NULL，如果是，则返回错误码-1。
 * 接着检查菜单项的进入函数指针enterFunc是否为NULL，如果不是，则调用该进入函数并传递菜单项指针。
 *
 * 返回值:
 * -1: 表示传入的菜单项指针为NULL，函数执行失败
 * 无返回值: 如果菜单项的进入函数指针为NULL，则不执行任何操作，也没有返回值
 */
int lcd_menu_entry(lcd_menu_t *menu)
{
    if (menu == NULL)
    {
        return -1;
    }
    if (menu->enterFunc != NULL)
    {
        menu->enterFunc(menu);
    }
}

/**
 * lcd_db_draw - 绘制单个LCD显示板
 * @db: 指向LCD显示板的指针
 *
 * 此函数用于绘制单个LCD显示板。首先检查传入的显示板指针是否为NULL，如果是，则返回错误码-1。
 * 接着显示显示板的图片，并在图片右侧显示显示板的文本。
 *
 * 返回值:
 * -1: 表示传入的显示板指针为NULL，函数执行失败
 * 0: 表示绘制成功
 */
int lcd_db_draw(lcd_display_board_t *db)
{
    if (db == NULL)
    {
        return -1;
    }

    /* 先显示图片 */
    lcd_show_picture(db->base_x, db->base_y, db->img.width, db->img.height, db->img.img);

    /* LCD中英文混合显示 */
    lcd_show_text(db->base_x + db->img.width + 3, db->base_y + 8, db->text.name, db->text.fc,
                  db->text.bc, db->text.font_size, 0);

    return 0;
}

/**
 * lcd_db_show - 显示多个LCD显示板
 * @lcd_dbs: 指向LCD显示板数组的指针
 * @db_num: 显示板的数量
 *
 * 此函数用于显示多个LCD显示板。遍历显示板数组，调用lcd_db_draw函数绘制每个显示板。
 */
int lcd_db_show(lcd_display_board_t *lcd_dbs[], int db_num)
{
    for (int i = 0; i < db_num; i++)
    {
        lcd_display_board_t *db = lcd_dbs[i];
        lcd_db_draw(db);
    }
}
